﻿Imports System.Drawing.Printing
Imports System.IO

'Todas las variables globales declaradas aqui
Module Globales
    Public resultScanner As String = ""
End Module

Public Class FormPrincipal
    Dim cambiosPendientes As Boolean = False
    Dim nombreArchivoAbierto As String = "Sin Nombre"

    '*****************************************************************************************************************
#Region "Barra de Menus"


    Private Sub AbrirToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AbrirToolStripMenuItem.Click, AbrirToolStripButton.Click
        Dim ofd As New OpenFileDialog
        Dim sr As IO.StreamReader

        If (cambiosPendientes) Then
            If MessageBox.Show("Los cambios realizados no se han guardado. ¿Desea continuar?", "Cambios sin guardar", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) = Windows.Forms.DialogResult.No Then
                Return
            End If
        End If

        ofd.Filter = "Archivo de Oberon [*.txt*]|*.txt|Todos los archivos [*.*]|*.*"
        ofd.CheckFileExists = True
        ofd.Title = "Abrir archivo..."
        ofd.ShowDialog()
        Try
            ofd.OpenFile()
            sr = IO.File.OpenText(ofd.FileName)
            textArea.Text = sr.ReadToEnd
            sr.Close()
            cambiosPendientes = False 'Ponemos False porque en la asignación 'textArea.Text =' se va al evento onChange y ahi se cambia a true la bandera
            nombreArchivoAbierto = ofd.FileName
            cambiarTituloVentana(nombreArchivoAbierto)
        Catch ex As Exception
            ' MessageBox.Show(ex.Message)
        End Try
    End Sub

    Private Sub GuardarToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GuardarToolStripMenuItem.Click, GuardarToolStripButton.Click
        If (nombreArchivoAbierto.Equals("Sin Nombre")) Then
            GuardarComoToolStripMenuItem_Click(sender, e)
        End If
        Try
            ' sw = IO.File.AppendText(nombreArchivoAbierto)
            'sw.Write(textArea.Text)
            'sw.Flush()
            IO.File.WriteAllText(nombreArchivoAbierto, textArea.Text)
            cambiosPendientes = False
            cambiarTituloVentana(nombreArchivoAbierto)
        Catch ex As Exception
            'MessageBox.Show(ex.Message)
        End Try
    End Sub

    Private Sub GuardarComoToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GuardarComoToolStripMenuItem.Click
        Dim sfd As New SaveFileDialog
        sfd.Filter = "Archivo de Oberon [*.txt*]|*.txt|Todos los archivos [*.*]|*.*"
        '        sfd.CheckFileExists = True
        sfd.Title = "Guardar"
        sfd.ShowDialog()
        Try
            'sw = IO.File.AppendText(sfd.FileName)
            'sw.WriteLine()
            IO.File.WriteAllText(sfd.FileName, textArea.Text)
            cambiosPendientes = False
            nombreArchivoAbierto = sfd.FileName
            cambiarTituloVentana(nombreArchivoAbierto)
        Catch ex As Exception
            'MessageBox.Show(ex.Message)
        End Try
    End Sub

    Private Sub NuevoToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NuevoToolStripMenuItem.Click, NuevoToolStripButton.Click
        If (cambiosPendientes) Then
            If MessageBox.Show("Los cambios realizados no se han guardado. ¿Desea continuar?", "Cambios sin guardar", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) = Windows.Forms.DialogResult.Yes Then
                textArea.Text = ""
                nombreArchivoAbierto = "Sin Nombre"
                cambiarTituloVentana(nombreArchivoAbierto)
            End If
        Else
            textArea.Text = ""
            nombreArchivoAbierto = "Sin Nombre"
            cambiarTituloVentana(nombreArchivoAbierto)
        End If
    End Sub

    Private Sub SalirToolStripMenuItem_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SalirToolStripMenuItem.Click
        Me.Close()
    End Sub

    Private Sub CopiarToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CopiarToolStripMenuItem.Click, CopiarToolStripButton.Click
        textArea.Copy()
    End Sub

    Private Sub PegarToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PegarToolStripMenuItem.Click, PegarToolStripButton.Click
        textArea.Paste()
    End Sub

    Private Sub CortarToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CortarToolStripMenuItem.Click, CortarToolStripButton.Click
        textArea.Cut()
    End Sub

    Private Sub DeshacerToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DeshacerToolStripMenuItem.Click, DeshacerToolStripButton.Click
        textArea.Undo()
    End Sub

    Private Sub RehacerToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RehacerToolStripMenuItem.Click, RehacerToolStripButton.Click
        textArea.Redo()
    End Sub

    Private Sub BuscarToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BuscarToolStripMenuItem.Click, BuscarYReemplazarToolStripButton.Click
        BuscarRemplazar.Show()
    End Sub

    Private Sub FuenteToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FuenteToolStripMenuItem.Click
        Dim Font As New FontDialog '// Aca decimos que cree un dialogo de cambiar fuente
        Font.ShowDialog(Me) '// Aca decimos que muestre el dialogo 
        textArea.SelectionFont = Font.Font '//Aca decimos que la fuente seleccionada se cambie en lo que hay seleccionado del texto
    End Sub

    Private Sub InsertarHoraYFechaToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles InsertarHoraYFechaToolStripMenuItem.Click
        textArea.SelectedText = Date.Now
    End Sub

    Private Sub ColorDeFondoToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ColorDeFondoToolStripMenuItem.Click
        Dim cd As New ColorDialog
        If cd.ShowDialog() = DialogResult.OK Then
            textArea.BackColor = cd.Color
        End If
    End Sub

    Private Sub ConfigurarScannerToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ConfigurarScannerToolStripMenuItem.Click
        ConfAnalizadorLex.Show()
    End Sub

    Private Sub EjecutarToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EjecutarToolStripMenuItem.Click, EjecutarToolStripButton.Click

        Dim filename As String = ""
        Dim param As String = ""
        If (cambiosPendientes) Then 'Verificamos que el archivo este guardado antes de ejecutar
            If (IO.File.Exists(nombreArchivoAbierto)) Then 'Si el archivo ya existe, lo guardamos directamente sin preguntar
                GuardarToolStripMenuItem_Click(sender, e)
            Else 'Si el archivo no existe le pedimos al usuario guardarlo
                If (MessageBox.Show("Debe guardar el archivo antes de poder ejecutar el scanner. ¿Desea gaurdar el archivo?", "Guardar para ejecutar scanner", MessageBoxButtons.YesNo, MessageBoxIcon.Information) = Windows.Forms.DialogResult.Yes) Then
                    GuardarComoToolStripMenuItem_Click(sender, e)
                    If Not IO.File.Exists(nombreArchivoAbierto) Then 'Si entra a este if es porque el usuario dio cancelar y no guardo el archivo
                        Return
                    End If
                Else
                    Return
                End If
            End If
        End If

        leerParametros(filename, param)
        If (filename.Equals("") Or param.Equals("")) Then
            Return
        End If
        Try
            Dim psi As New ProcessStartInfo
            psi.FileName = filename
            psi.Arguments = Chr(34) & nombreArchivoAbierto & Chr(34) & " " & Chr(34) & param & Chr(34)
            psi.WindowStyle = ProcessWindowStyle.Maximized
            psi.RedirectStandardOutput = True
            psi.RedirectStandardError = True
            psi.UseShellExecute = False
            Dim p As Process = Process.Start(psi)
            Dim sr As StreamReader = p.StandardOutput
            Dim output As String = sr.ReadToEnd()
            'MsgBox(output)
            resultScanner = output.Trim
            If (resultScanner.Equals("")) Then
                MessageBox.Show("La compilación se realizo exitosamente", "Compilación Exitosa!", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Else
                FormResultado.Show()
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try

    End Sub


    Private Sub AyudaToolStripMenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AyudaToolStripMenuItem1.Click
        System.Diagnostics.Process.Start("data\ayuda.pdf")
    End Sub

    Private Sub AcercaDeToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AcercaDeToolStripMenuItem.Click
        FormAcercade.Show()
    End Sub


#End Region


    '*****************************************************************************************************************
    '*****************************************************************************************************************

    Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
        If (cambiosPendientes) Then
            If MessageBox.Show("Los cambios realizados no se han guardado. ¿Desea cerrar el editor de todos modos?", "Cambios sin guardar", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) = Windows.Forms.DialogResult.No Then
                e.Cancel = True
            End If
        End If
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Text = nombreArchivoAbierto
        validarBotonEjecutar()
        mostrarNumLinea()

    End Sub

    Private Sub textArea_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles textArea.TextChanged
        cambiosPendientes = True
        cambiarTituloVentana(nombreArchivoAbierto & " *")
        validarBotonEjecutar()
    End Sub

    Private Sub cambiarTituloVentana(ByVal t As String)
        Me.Text = t
    End Sub

    Private Sub validarBotonEjecutar()
        If (textArea.Text.Equals("")) Then
            EjecutarToolStripButton.Enabled = False
            EjecutarToolStripMenuItem.Enabled = False
        Else
            EjecutarToolStripButton.Enabled = True
            EjecutarToolStripMenuItem.Enabled = True
        End If
    End Sub

    Private Sub mostrarNumLinea()
        Dim pt As Point
        Dim index As Integer = 0
        Dim row As Long
        Dim col As Long
        index = textArea.GetFirstCharIndexOfCurrentLine()
        row = textArea.GetLineFromCharIndex(index)
        index = textArea.SelectionStart
        pt = textArea.GetPositionFromCharIndex(index)
        pt.X = 0
        col = index - textArea.GetCharIndexFromPosition(pt)
        numLinea.Text = Convert.ToString("Lin: " & (row + 1) & " Col : " & (col + 1))

    End Sub

    Private Sub leerParametros(ByRef filename As String, ByRef arguments As String)
        Dim sr As IO.StreamReader
        Dim contenidoParam As String
        Dim rutaActual = Environment.CurrentDirectory
        Dim param() As String
        If IO.File.Exists(rutaActual & "\data\param.txt") Then
            sr = IO.File.OpenText(rutaActual & "\data\param.txt")
            contenidoParam = sr.ReadToEnd()
            param = Split(contenidoParam, vbCrLf) 'Split por ENTER. param contiene todas las lineas del archivo

            'EL orden de lectura es igual al orden en que se escribieron los datos en el archivo
            'sw.WriteLine("MAXLINEA;" & txtMAXLINEA.Text)
            'sw.WriteLine("MAXDIGIT;" & txtMAXDIGIT.Text)
            'sw.WriteLine("MAXID;" & txtMAXID.Text)
            'sw.WriteLine("UBICACIONSCANNER;" & txtUBICACIONSCANNER.Text)

            filename = Split(param(4), ";")(1) ' En param(4) esta la ubicacion del scanner.exe y en la posicion 1 la url (en la posicion 0 esta el nombre de la variable)
            arguments = rutaActual & "\data\param.txt"

            If Not IO.File.Exists(filename) Then
                MessageBox.Show("No se encontró el archivo " & filename, "Archivo no Encontrado", MessageBoxButtons.OK, MessageBoxIcon.Information)
                filename = ""
                arguments = ""
            End If
        Else
            MessageBox.Show("No se encontró la configuración para el archivo de parámetros param.txt." & vbCrLf & "Diríjase al menú Herramientas->Configurar scanner para configurar los parámetros", "Parámetros no configurados", MessageBoxButtons.OK, MessageBoxIcon.Information)
            filename = ""
            arguments = ""
        End If
    End Sub

    Private Sub textArea_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles textArea.KeyPress
        mostrarNumLinea()
    End Sub
End Class
